#include "StdAfx.h"
#include "SapoFactory.h"


	static int posXdefault = 5;
	static int posYdefault = 5;
	static double radioDefault = 2;


SapoFactory::SapoFactory(void)
{
}

Sapo* SapoFactory::getSapoInstance(NodoXML* nodo,Escenario* esc){



	//###########Obtengo id##################
	
	string idSapo = nodo->getAttribute("id");

	if (idSapo == ""){
	
		Log4Cpp::error("id de Sapo no encontrado, se usa por defecto.\n","SapoFactory");
//		idSapo += ;  implementar id por defecto

	}

	
	//###########Obtengo posiciones##################
	
	//genero los enteros necesarios para inicializar el sapo.
	double ejeX = 0;
	double ejeY = 0;
	
	//genero los strings necesarios
	std::string xenString;
	std::string yenString;

	//pido el elemento posicion del nodo sapo
	
	vector<NodoXML> vectorcito = nodo->getChildrenList("posicion");

	//defino el nodo posicion
	
	NodoXML posicion;

	//verifico que el sapo tenga un elemento posicion, sino pongo por defecto
	if (! vectorcito.empty()){
	
		posicion = nodo->getChildrenList("posicion")[0];
		
	} else {//si no habia un elemento posicion, entonces genero uno por defecto
		
		Log4Cpp::error("Posicion del elemento sapo no encontrada en XML, se utiliza por defecto: x=5 y=5.\n","SapoFactory");
		NodoXML nodoHarcodeado = NodoXML("posicion");
		nodoHarcodeado.addAttribute("x","5");
		nodoHarcodeado.addAttribute("y","5");
		posicion = nodoHarcodeado;
	}
	
	//obtengo la posicion en 'x' e 'y'
	xenString = posicion.getAttribute("x");
	yenString = posicion.getAttribute("y");
	
	
	//convierto la posicion, que era string, en entero
	if(xenString != "")
	{
		ejeX = atof(  xenString.c_str());
	} else { //si no se define la posicion del sapo utilizo la harcodeada

		Log4Cpp::error("Posicion X de elemento Sapo no definida, se utiliza por defecto.\n","SapoFactory");
		ejeX = posXdefault;    
	}

	if(yenString != "")
	{
		ejeY = atof(yenString.c_str());
	}else { //si no se define la posicion del sapo utilizo la harcodeada

		Log4Cpp::error("Posicion Y de elemento Sapo no definida, se utiliza por defecto.\n","SapoFactory");
		ejeY = posXdefault;    
	}

	//#################Ya obtuve las posiciones#############3

    //################# obtengo el radio#############3

	double radio;



	vector<NodoXML> vectorcito2 = nodo->getChildrenList("radio");

	//defino el nodo radio

	NodoXML radNod;

	
	//verifico que el sapo tenga un elemento posicion, sino pongo por defecto
	if (! vectorcito2.empty()){
	
		radNod = nodo->getChildrenList("radio")[0];
		
	} else {//si no habia un elemento posicion, entonces genero uno por defecto
		
		Log4Cpp::error("Radio del elemento sapo no encontrada en XML, se utiliza por defecto: 2.\n","SapoFactory");
		NodoXML nodoHarcodeado = NodoXML("radio");
		nodoHarcodeado.addAttribute("valor","2");
		radNod = nodoHarcodeado;
	}

	//obtengo el radio
	std::string radString = radNod.getAttribute("valor");

	if(radString != "")
	{
		radio = atof( radString.c_str());
	} else { //si no se define el radio del sapo utilizo la harcodeada

		Log4Cpp::error("Radio de elemento Sapo no definido, se utiliza radio por defecto.\n","SapoFactory");
		radio = radioDefault;    
	}

	if ( radio<0) { //chequeo que sea un radio positivo
		Log4Cpp::error("Radio de elemento Sapo negativo, se utiliza radio por defecto.\n","SapoFactory");
		radio = radioDefault;

	}

	//#################Ya obtuve el radio#############3
	
	//################# obtengo la textura y color #############3

	Textura* fondoAsetear;
	
	//fondos
	String idTextFondoLocal = nodo->getAttribute("idTextura"); // textura obtenida localmente
	String idTextFondoDefaultEsc = esc->GetGeneral()->GetIdTextEle(); // textura default del general
	String colorFondoLocal = nodo->getAttribute("colorElemento"); // color fondo local
	String colorFondoDefaultEsc = esc->GetGeneral()->GetColorFondoElem(); // color fondo default del general
	String colorFondoHarcode = "111111111";
	//lineas
	String colorLineaLocal = nodo->getAttribute("colorLinea"); // color linea local
	String colorLineaDefaultEsc = esc->GetGeneral()->GetColorLinea(); // color linea default general
	String colorLineaHarcode = "222222222";

	/* orden de prioridad:
	para fondos:
	1- Fondo Textura local
	2- Fondo Color local
	3- Fondo Textura General
	4- Fondo Color general
	5- Fondo Color Harcodeado
	para lineas:
	1- Color linea local
	2- Color linea General
	3- Color linea harcodeado
	*/
	//trabajo con los fondos: considero que si hay un id textura el mismo debe existir, puesto que esta
	//validado en la clase validador
	if(idTextFondoLocal.comparar("") != 0)  //primera prioridad
		
		fondoAsetear = esc->GetTextura (idTextFondoLocal);  //obtengo la textura mediante su id
	
	else if (colorFondoLocal.comparar("") != 0) //segunda prioridad
			
		fondoAsetear = new Textura(colorFondoLocal);
			
	else if (idTextFondoDefaultEsc.comparar("") != 0) //tercera prioridad
			
		fondoAsetear = esc->GetTextura (idTextFondoDefaultEsc);

	else if (colorFondoDefaultEsc.comparar("") != 0) //cuarta prioridad
		
		fondoAsetear = new Textura(colorFondoDefaultEsc);

	else{
		
		Log4Cpp::error("no se han hallado colores o texturas de fondo validas para el sapo, se setea default.\n","SapoFactory");
		fondoAsetear = new Textura(colorFondoHarcode);

	}

	//trabajo con las lineas

	if(colorLineaLocal.comparar("") != 0)  //primera prioridad
		
		fondoAsetear->setRGBLinea(colorLineaLocal);  //genero la textura para la linea local
	
	else if (colorLineaDefaultEsc.comparar("") != 0) //segunda prioridad
			
		fondoAsetear->setRGBLinea(colorLineaDefaultEsc);

	else{
		Log4Cpp::error("no se han hallado colores de linea, validos para el sapo, se setea default.\n","SapoFactory");
		fondoAsetear->setRGBLinea(colorLineaHarcode);

	}

	return new Sapo(fondoAsetear,radio,ejeX,ejeY,idSapo);

}
